//总线握手场景描述：
//a) 总线master发出data信号，同时master用valid信号拉高表示data有效；
//b) 总线slave发出ready信号，ready信号拉高表示slave可以接收数据；
//c) 当valid和slave同时为高时，表示data信号从master到slave发送接收成功。
//实现上述总线考虑ready异步场景
module axi_test_sy2_tb;

    reg  clk,rstn;
    reg  ready_i,valid_i;//三级流水线的输入信号，ready_i接入slaver，valid_i接入master
    wire ready_o,valid_o;//对应slaver的valid，master的ready
	 reg [7:0]data_i;//输入数据
	 wire [7:0]data_o;//输出数据
	 reg ready_i1;
 
source_pb source_pb1(
    .clk    (clk)  ,
    .rstn   (rstn),
    .data_i (data_i),
    .data_o  (data_o),
    //slave signal
    .valid_i(valid_i),
    .ready_o(ready_o),
    //master signal
    .ready_i(ready_i1),
    .valid_o(valid_o)
);//三级寄存器流水线，模拟反压，和多个数据传输，采用三个流水线寄存器直连实现
	 
initial clk = 1'b0;
always #5 clk = ~clk;


    initial begin
        rstn <= 0;
        #20
        rstn <= 1;                                              
        valid_i<=0;ready_i<=0;
        #18
        ready_i<=1; //异步触发
		  #7 valid_i<=1;//同步ready
        #50;
		  valid_i <= 1'b0;
		  @(negedge valid_o);
		  ready_i <=1'b0;
		  #20;
		  
		  valid_i=1'b1;
		  #6;
		  ready_i =1'b1;//模拟ready之后valid随后拉高
        #24;//保证之后的时序是同步的
		  
		  valid_i <= 1'b0;
		  @(negedge valid_o);//设计了三级流水寄存器，因此valid_i结束后还会再输出三个周期
		  ready_i <=1'b0;
		  #14;
		  
		  ready_i=1'b1;
		  #16;
		  valid_i =1'b1;//模拟valid拉高之后ready随后拉高
        #20;
		  valid_i <= 1'b0;
		  @(negedge valid_o);
		  ready_i <=1'b0;
		  #14;
        valid_i<=1;
		  #6 ready_i<=0; //流水下游反压，在slaver中断ready的时候将数据暂时压入流水寄存器，待需要时再输出
        #20;
        valid_i<=0;
		  #3 ready_i<=1; //master断流，观察变化
        #27;
        ready_i<=1;valid_i<=0; //观察压入的数据是否输出正确
        #100;
		  $stop;
    end


	 always@(posedge clk)begin
	 ready_i1 <= ready_i;
	 end

	 
	 always@(posedge clk)begin
	 if(!rstn)
	 data_i <= 8'h15;
	 else if(valid_i)
	 data_i <= data_i + 1'b1;
	 end//在valid有效时每个周期增加一位
	 
reg trans_valid;
reg [7:0]tran_data;

always@(*)begin
   if(valid_o&&ready_i)begin
	trans_valid = 1'b1;
	tran_data = data_o;
	end
	else begin
   trans_valid = 1'b0;
	tran_data = 8'b0;
	end
	end

	 
endmodule